iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0

前言:今天不寫程式

四天下來,手上有一顆自己編出來的 .wasm、一個叫得動它的 SvelteKit 專案、一張有贏有輸的表。今天不加新東西,把這四天親手摸過的東西收成三個概念,看清楚手上有哪些零件;然後說接下來要拿它們做什麼。

不是新語言,是編譯目標

先講結論:WebAssembly 不是一個新的程式語言,是一個編譯目標。所以你手上多的不是一套語法,是一條編譯的工作流程:Rust 照寫,target 換成 wasm32-unknown-unknown,編出來的不是執行檔,是一個檔案;把它複製進專案,npm run wasm 一條指令,以後改了 Rust 就跑這一條。打開看,wasm-tools print 裡你寫的 add 在 export 表上,(param i32 i32) (result i32) 型別寫死。

import 表與 export 表

它跟外面之間只有一道邊界,邊界上兩張表。export 表是它給外面的唯一窗口:add 在表上,瀏覽器的 instantiateStreaming 載進來之後才叫得到;把 #[unsafe(no_mangle)] 拿掉,函數還在檔案裡,表上沒有,Console 就是 add is not a function。import 表是它跟宿主要的:一開始是空的 {},它什麼都不要;後來它開口要一個 console.log,宿主少給一個就起不來,而且是建實例那一刻就炸,不是等到叫了才炸。表以外的兩件事各一句:資料走那塊線性記憶體,你手上的只是一個 view,用完即丟;狀態活在 instance,不在檔案裡,重新建一個就歸零。

benchmark 表

五條規矩、四題、兩份實作,答案不是一個倍數,是一張 benchmark 表:mandelbrot 打平、convolve 三倍多、兩百萬次 add() 輸給「不存在的函式呼叫」、word count 差不多打平。跨一次邊界只要幾奈秒,貴的是把工作切得太碎。比的是跟 JS,不是跟 native;它在瀏覽器裡的價值是「一顆檔案,誰載都一樣」,快是特定形狀下的贈品。

接下來

這三個概念各自躺在自己那一天的專案裡,接下來要把它們裝成一個完整的、能給人看的前端專案,三個概念各對一個部位。編譯流程:專案裡還是 npm run wasm 那一條,Rust 那邊一個字不動。兩張表:一頁「導入」,把兩顆檔案的 import 表跟 export 表直接印在自己的頁面上——第一次看到 export 表上的 add 是在終端機裡,這次是在自己的頁面上。benchmark 表:一頁「量測」,同一批題目、同一個量級的數字,換一套像樣的畫面。wasm 那幾支檔案幾乎不用動,動的是畫面層——前幾天那句「跟 wasm 有關的程式碼全部住在純 TypeScript 檔裡,.svelte 只負責畫面」,到時候一起兌現。明天正式公開,敬請期待。

結語

一句帶走:它是編譯目標,所以有一條編譯流程;它跟外面只有兩張表;值不值得,看 benchmark 表。明天把這三樣裝成一個專案。


上一篇
Day 05|真的有加速嗎?JS 對決 .wasm
下一篇
Day 07|前端整合
系列文
Tool Use Is All You Need:30 天用 WebAssembly 試圖控制 Agent 的手腳9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言